/**
void bfs(int flag,int x,int y){
    int dx,dy;
    node p,next;
    queue<node> que;
    p.x=x;
    p.y=y;
    que.push(p);
    if(flag==1){
        while(!que.empty()){
            p=que.front();
            que.pop();
            for(int i=0;i<4;i++){
                dx=p.x+to[i][0];
                dy=p.x+to[i][1];
                if(check(dx,dy)){
                    vis[dx][dy]=1;
                    next.x=dx;
                    next.y=dy;
                    que.push(next);
                    ycnt[dx][dy]=ycnt[p.x][p.y]+11;
                }
            }
        }
    }
    else{
        while(!que.empty()){
            p=que.front();
            que.pop();
            for(int i=0;i<4;i++){
                dx=p.x+to[i][0];
                dy=p.x+to[i][1];
                if(check(dx,dy)){
                    vis[dx][dy]=1;
                    next.x=dx;
                    next.y=dy;
                    que.push(next);
                    mcnt[dx][dy]=mcnt[p.x][p.y]+11;                 
                }
            }
        }
    }
}
int main(void){
    while(~scanf("%d%d",&n,&m)){
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                ycnt[i][j]=0;
                mcnt[i][j]=0;
                vis[i][j]=0;
                //记录y的位置
                if(map[i][j]=='Y'){
                    yx=i;
                    yy=j;
                }
                //记录m的位置
                else if(map[i][j]=='M'){
                    mx=i;
                    my=j;
                }
                //记录多个kfc的位置
                else if(map[i][j]=='@'){
                    kfc[kfc_num][0]=i;
                    kfc[kfc_num++][1]=j;
                }
            }
        }       
    }
    return 0;
}
**/
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN=210;
int n,m;
int ycnt[MAXN][MAXN];
int mcnt[MAXN][MAXN];
int vis[MAXN][MAXN];
int kfc[MAXN*MAXN][2];
int to[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char map[MAXN][MAXN];
struct node{
    int x;
    int y;
};
bool check(int x,int y){
    if(x>=0 && x<n && y>=0 && y<m && map[x][y]!='#' && vis[x][y]==0){
        return true;
    }
    else{
        return false;
    }
}
void bfs(int flag,int x,int y)
{
    int dx,dy;
    node p,temp;
    queue<node> q;
    p.x=x;
    p.y=y;
    q.push(p);
    if(flag==1)
    {
        while(!q.empty())
        {
          p=q.front();
          q.pop();
          for(int i=0;i<4;i++)
          {
              dx=p.x+to[i][0];dy=p.y+to[i][1];
              if(check(dx,dy))
              {
                 vis[dx][dy]=-1;
                 temp.x=dx;
                 temp.y=dy;
                 q.push(temp);
                 ycnt[dx][dy]=ycnt[p.x][p.y]+11;
              }
          }
        }
    }
    else
    {
        while(!q.empty())
        {
          p=q.front();
          q.pop();
          for(int i=0;i<4;i++)
          {
              dx=p.x+to[i][0];dy=p.y+to[i][1];
              if(check(dx,dy))
              {
                 vis[dx][dy]=-1;
                 temp.x=dx;
                 temp.y=dy;
                 q.push(temp);
                 mcnt[dx][dy]=mcnt[p.x][p.y]+11;
              }
          }
        }
    }
}
int main()
{
    int kfc[40005][2];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int kfc_num=0;
        int min=1e8;
        int yx,yy,mx,my;
        getchar();
        for(int i=0;i<n;i++){
            scanf("%s",map[i]);
        }  
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                ycnt[i][j]=0;
                mcnt[i][j]=0;
                vis[i][j]=0;
                if(map[i][j]=='Y')
                {
                  yx=i;
                  yy=j;
                }
                else if(map[i][j]=='M')
                {
                  mx=i;
                  my=j;
                }
                else if(map[i][j]=='@')
                {
                  kfc[kfc_num][0]=i;
                  kfc[kfc_num++][1]=j;
                }
            }
        }
        memset(vis,0,sizeof(vis));
        vis[yx][yy]=1;
        bfs(1,yx,yy);
        memset(vis,0,sizeof(vis));
        vis[mx][my]=1;
        bfs(0,mx,my);
        for(int i=0;i<kfc_num;i++){
            //y m都能到达的kfc
            if(ycnt[kfc[i][0]][kfc[i][1]]!=0 && mcnt[kfc[i][0]][kfc[i][1]]){
                if((ycnt[kfc[i][0]][kfc[i][1]]+mcnt[kfc[i][0]][kfc[i][1]])<min){
                    min=(ycnt[kfc[i][0]][kfc[i][1]]+mcnt[kfc[i][0]][kfc[i][1]]);
                }
            }
        }
        printf("%d\n",min);
    }
    return 0;
}